#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

// 定义温度数据结构
typedef struct {
    float value;        // 温度值(摄氏度)
    time_t timestamp;   // 时间戳
} TemperatureData;

// 定义湿度数据结构
typedef struct {
    float value;        // 湿度值(百分比)
    time_t timestamp;   // 时间戳
} HumidityData;

// 定义光照强度数据结构
typedef struct {
    int value;          // 光照强度值(勒克斯)
    time_t timestamp;   // 时间戳
} LightData;

// 定义循环缓冲区结构体
typedef struct {
    TemperatureData temp_data[100]; // 温度数据缓冲区
    HumidityData hum_data[100];     // 湿度数据缓冲区
    LightData light_data[100];      // 光照数据缓冲区
    int head;                       // 当前写入位置
    int count;                      // 当前数据数量
} DataBuffer;

// 初始化缓冲区
void init_buffer(DataBuffer *buffer) {
    buffer->head = 0;
    buffer->count = 0;
}

// 向缓冲区添加数据
void add_to_buffer(DataBuffer *buffer, TemperatureData temp, HumidityData hum, LightData light) {
    buffer->temp_data[buffer->head] = temp;
    buffer->hum_data[buffer->head] = hum;
    buffer->light_data[buffer->head] = light;
    
    buffer->head = (buffer->head + 1) % 100;
    if (buffer->count < 100) {
        buffer->count++;
    }
}

// 生成随机温度数据
TemperatureData generate_temperature() {
    TemperatureData data;
    data.timestamp = time(NULL);
    data.value = 15.0 + (rand() % 200) / 10.0f; // 15.0-35.0°C
    return data;
}

// 生成随机湿度数据
HumidityData generate_humidity() {
    HumidityData data;
    data.timestamp = time(NULL);
    data.value = 30.0 + (rand() % 550) / 10.0f; // 30.0-85.0%
    return data;
}

// 生成随机光照数据
LightData generate_light() {
    LightData data;
    data.timestamp = time(NULL);
    data.value = rand() % 2001; // 0-2000 lux
    return data;
}

// 格式化时间字符串
void format_time(char *buffer, time_t timestamp) {
    struct tm *timeinfo = localtime(&timestamp);
    strftime(buffer, 20, "%H:%M:%S", timeinfo);
}

int main() {
    srand(time(NULL)); // 初始化随机数种子
    DataBuffer buffer;
    init_buffer(&buffer);
    
    printf("开始生成环境数据...\n");
    printf("时间     | 温度(°C) | 湿度(%%) | 光照(lux)\n");
    printf("----------------------------------------\n");
    
    while (1) {
        // 生成新数据
        TemperatureData temp = generate_temperature();
        HumidityData hum = generate_humidity();
        LightData light = generate_light();
        
        // 添加到缓冲区
        add_to_buffer(&buffer, temp, hum, light);
        
        // 显示最新数据
        char time_str[20];
        format_time(time_str, temp.timestamp);
        printf("%s | %7.1f | %6.1f | %8d\n", 
               time_str, temp.value, hum.value, light.value);
        
        sleep(1); // 等待1秒
    }
    
    return 0;
}

